
/// <reference path="jquery-1.3.2-vsdoc.js"/>

// MSDropDown - jquery.dd.js
// author: Marghoob Suleman
// Date: 12th Aug, 2009
// Version: 2.1 {date: 3rd Sep 2009}
// Revision: 25
// web: www.giftlelo.com | www.marghoobsuleman.com
 (function($) {
     var oldDiv = "";
     $.fn.dd = function(options) {
         $this = this;
         options = $.extend({
             height: 120,
             visibleRows: 9,
             rowHeight: 22,
             showIcon: true,
             zIndex: 9999,
             style: ''
         }, options);
         var selectedValue = "";
         var actionSettings = {};
         actionSettings.insideWindow = true;
         actionSettings.keyboardAction = false;
         actionSettings.currentKey = null;
         var ddList = false;
         config = { postElementHolder: '_msddHolder', postID: '_msdd', postTitleID: '_title', postTitleTextID: '_titletext', postChildID: '_child', postAID: '_msa', postOPTAID: '_msopta', postInputID: '_msinput', postArrowID: '_arrow', postInputhidden: '_inp' };
         styles = { dd: 'dd', ddTitle: 'ddTitle', arrow: 'arrow', ddChild: 'ddChild', disbaled: .30 };
         attributes = { actions: "onfocus,onblur,onchange,onclick,ondblclick,onmousedown,onmouseup,onmouseover,onmousemove,onmouseout,onkeypress,onkeydown,onkeyup", prop: "size,multiple,disabled,tabindex" };
         var elementid = $(this).attr("id");
         var inlineCSS = $(this).attr("style");
         options.style += (inlineCSS == undefined) ? "" : inlineCSS;

         var allOptions = $(this).children();
         ddList = ($(this).attr("size") > 0 || $(this).attr("multiple") == true) ? true : false;
         if (ddList) { options.visibleRows = $(this).attr("size"); };
         var a_array = {}; //stores id, html & value etc
         //create wrapper
         createDropDown();

         function getPostID(id) {
             return elementid + config[id];
         };
         function getOptionsProperties(option) {
             var currentOption = option;
             var styles = $(currentOption).attr("style");
             return styles;
         };
         function matchIndex(index) {
             var selectedIndex = $("#" + elementid + " option:selected");
             if (selectedIndex.length > 1) {
                 for (var i = 0; i < selectedIndex.length; i++) {
                     if (index == selectedIndex[i].index) {
                         return true;
                     };
                 };
             } else if (selectedIndex.length == 1) {
                 if (selectedIndex[0].index == index) {
                     return true;
                 };
             };
             return false;
         }
         function createATags() {
             var childnodes = allOptions;
             var aTag = "";
             var aidfix = getPostID("postAID");
             var aidoptfix = getPostID("postOPTAID");
             childnodes.each(function(current) {
                 var currentOption = childnodes[current];
                 //OPTGROUP
                 if (currentOption.nodeName == "OPTGROUP") {
                     aTag += "<div class='opta'>";
                     aTag += "<span style='font-weight:bold;font-style:italic; clear:both;'>" + $(currentOption).attr("label") + "</span>";
                     var optChild = $(currentOption).children();
                     optChild.each(function(currentopt) {
                         var currentOptOption = optChild[currentopt];
                         var aid = aidoptfix + "_" + (current) + "_" + (currentopt);
                         var arrow = $(currentOptOption).attr("title");
                         arrow = (arrow.length == 0) ? "" : '<img src="' + arrow + '" align="left" /> ';
                         var sText = $(currentOptOption).text();
                         var sValue = $(currentOptOption).val();
                         var sEnabledClass = ($(currentOptOption).attr("disabled") == true) ? "disabled" : "enabled";
                         a_array[aid] = { html: arrow + sText, value: sValue, text: sText, index: currentOptOption.index, id: aid };
                         var innerStyle = getOptionsProperties(currentOptOption);
                         if (matchIndex(currentOptOption.index) == true) {
                             aTag += '<a href="javascript:void(0);" class="selected ' + sEnabledClass + '"';
                         } else {
                             aTag += '<a  href="javascript:void(0);" class="' + sEnabledClass + '"';
                         };
                         if (innerStyle != false)
                             aTag += ' style="' + innerStyle + '"';
                         aTag += ' id="' + aid + '">';
                         aTag += arrow + sText + '</a>';
                     });
                     aTag += "</div>";

                 } else {
                     var aid = aidfix + "_" + (current);
                     var arrow = $(currentOption).attr("title");
                     arrow = (arrow.length == 0) ? "" : '<img src="' + arrow + '" align="left" /> ';
                     var sText = $(currentOption).text();
                     var sValue = $(currentOption).val();
                     var sEnabledClass = ($(currentOption).attr("disabled") == true) ? "disabled" : "enabled";
                     a_array[aid] = { html: arrow + sText, value: sValue, text: sText, index: currentOption.index, id: aid };
                     var innerStyle = getOptionsProperties(currentOption);
                     if (matchIndex(currentOption.index) == true) {
                         aTag += '<a href="javascript:void(0);" class="selected ' + sEnabledClass + '"';
                     } else {
                         aTag += '<a  href="javascript:void(0);" class="' + sEnabledClass + '"';
                     };
                     if (innerStyle != false)
                         aTag += ' style="' + innerStyle + '"';
                     aTag += ' id="' + aid + '">';
                     aTag += arrow + sText + '</a>';
                 };
             });
             return aTag;
         };
         function createChildDiv() {
             var id = getPostID("postID");
             var childid = getPostID("postChildID");
             var sStyle = options.style;
             sDiv = "";
             sDiv += '<div id="' + childid + '" class="' + styles.ddChild + '"';
             if (!ddList) {
                 sDiv += (sStyle != "") ? ' style="' + sStyle + '"' : '';
             } else {
                 sDiv += (sStyle != "") ? ' style="border-top:1px solid #c3c3c3;display:block;position:relative;' + sStyle + '"' : '';
             }
             sDiv += '>';
             return sDiv;
         };

         function createTitleDiv() {
             var titleid = getPostID("postTitleID");
             var arrowid = getPostID("postArrowID");
             var titletextid = getPostID("postTitleTextID");
             var inputhidden = getPostID("postInputhidden");
             var sText = $("#" + elementid + " option:selected").text();
             var arrow = $("#" + elementid + " option:selected").attr("title");
             arrow = (arrow.length == 0 || arrow == undefined || options.showIcon == false) ? "" : '<img src="' + arrow + '" align="left" /> ';
             var sDiv = '<div id="' + titleid + '" class="' + styles.ddTitle + '"';
             sDiv += '>';
             sDiv += '<span id="' + arrowid + '" class="' + styles.arrow + '"></span><span class="textTitle" id="' + titletextid + '">' + arrow + sText + '</span></div>';
             return sDiv;
         };
         function createDropDown() {
             var changeInsertionPoint = false;
             var id = getPostID("postID");
             var titleid = getPostID("postTitleID");
             var titletextid = getPostID("postTitleTextID");
             var childid = getPostID("postChildID");
             var arrowid = getPostID("postArrowID");
             var iWidth = $("#" + elementid).width()+15;// nasa8x
             var sStyle = options.style;
             if ($("#" + id).length > 0) {
                 $("#" + id).remove();
                 changeInsertionPoint = true;
             }
             var sDiv = '<div id="' + id + '" class="' + styles.dd + '"';
             sDiv += (sStyle != "") ? ' style="' + sStyle + '"' : '';
             sDiv += '>';
             //create title bar
             if (!ddList)
                 sDiv += createTitleDiv();
             //create child
             sDiv += createChildDiv();
             sDiv += createATags();
             sDiv += "</div>";
             sDiv += "</div>";
             if (changeInsertionPoint == true) {
                 var sid = getPostID("postElementHolder");
                 $("#" + sid).after(sDiv);
             } else {
                 $("#" + elementid).after(sDiv);
             }
             $("#" + id).css("width", iWidth + "px");
             $("#" + childid).css("width", (iWidth-2) + "px");
             if (allOptions.length > options.visibleRows) {
                 var margin = parseInt($("#" + childid + " a:first").css("padding-bottom")) + parseInt($("#" + childid + " a:first").css("padding-top"));
                 var iHeight = ((options.rowHeight) * options.visibleRows) - margin;
                 $("#" + childid).css("height", iHeight + "px");
             }

             //set out of vision
             if (changeInsertionPoint == false) {
                 setOutOfVision();
                 addNewEvents(elementid);
             }
             if ($("#" + elementid).attr("disabled") == true) {
                 $("#" + id).css("opacity", styles.disbaled);
             } else {
                 applyEvents();
                 //add events
                 //arrow hightlight
                 if (!ddList) {
                     $("#" + titleid).bind("mouseover", function(event) {
                         hightlightArrow(1);
                     });
                     $("#" + titleid).bind("mouseout", function(event) {
                         hightlightArrow(0);
                     });
                 };
                 //open close events
                 $("#" + childid + " a.enabled").bind("click", function(event) {
                     event.preventDefault();
                     manageSelection(this);
                     if (!ddList) {
                         $("#" + childid).unbind("mouseover");
                         setInsideWindow(false);
                         var sText = (options.showIcon == false) ? $(this).text() : $(this).html();
                         setTitleText(sText);
                         closeMe();
                     };
                     setValue();
                     //actionSettings.oldIndex = a_array[$(this).attr("id")].index;
                 });
                 $("#" + childid + " a.disabled").css("opacity", styles.disbaled);
                 if (ddList) {
                     $("#" + childid).bind("mouseover", function(event) {
                         if (!actionSettings.keyboardAction) {
                             actionSettings.keyboardAction = true;
                             $(document).bind("keydown", function(event) {
                                 var keyCode = event.keyCode;
                                 actionSettings.currentKey = keyCode;
                                 if (keyCode == 39 || keyCode == 40) {
                                     //move to next
                                     event.preventDefault(); event.stopPropagation();
                                     next();
                                     setValue();
                                 };
                                 if (keyCode == 37 || keyCode == 38) {
                                     event.preventDefault(); event.stopPropagation();
                                     //move to previous
                                     previous();
                                     setValue();
                                 };
                             });

                         }
                     });
                 };
                 $("#" + childid).bind("mouseout", function(event) { setInsideWindow(false); $(document).unbind("keydown"); actionSettings.keyboardAction = false; actionSettings.currentKey = null; });
                 if (!ddList) {
                     $("#" + titleid).bind("click", function(event) {
                         setInsideWindow(false);
                         if ($("#" + childid + ":visible").length == 1) {
                             $("#" + childid).unbind("mouseover");
                         } else {
                             $("#" + childid).bind("mouseover", function(event) { setInsideWindow(true); });
                             openMe();
                         };
                     });
                 };
                 $("#" + titleid).bind("mouseout", function(evt) {
                     setInsideWindow(false);
                 })
             };
         };
         function getByIndex(index) {
             for (var i in a_array) {
                 if (a_array[i].index == index) {
                     return a_array[i];
                 }
             }
         }
         function manageSelection(obj) {
             var childid = getPostID("postChildID");
             if (!ddList) {
                 $("#" + childid + " a.selected").removeClass("selected");
             }
             var selectedA = $("#" + childid + " a.selected").attr("id");
             if (selectedA != undefined) {
                 var oldIndex = (actionSettings.oldIndex == undefined || actionSettings.oldIndex == null) ? a_array[selectedA].index : actionSettings.oldIndex;
             };
             if (obj && !ddList) {
                 $(obj).addClass("selected");
             };
             if (ddList) {
                 var keyCode = actionSettings.currentKey;
                 if ($("#" + elementid).attr("multiple") == true) {
                     if (keyCode == 17) {
                         //control
                         actionSettings.oldIndex = a_array[$(obj).attr("id")].index;
                         $(obj).toggleClass("selected");
                         //multiple
                     } else if (keyCode == 16) {
                         $("#" + childid + " a.selected").removeClass("selected");
                         $(obj).addClass("selected");
                         //shift
                         var currentSelected = $(obj).attr("id");
                         var currentIndex = a_array[currentSelected].index;
                         for (var i = Math.min(oldIndex, currentIndex); i <= Math.max(oldIndex, currentIndex); i++) {
                             $("#" + getByIndex(i).id).addClass("selected");
                         }
                     } else {
                         $("#" + childid + " a.selected").removeClass("selected");
                         $(obj).addClass("selected");
                         actionSettings.oldIndex = a_array[$(obj).attr("id")].index;
                     };
                 } else {
                     $("#" + childid + " a.selected").removeClass("selected");
                     $(obj).addClass("selected");
                     actionSettings.oldIndex = a_array[$(obj).attr("id")].index;
                 };
             };
         };
         function addNewEvents(id) {
             document.getElementById(id).refresh = function(e) {
                 $("#" + this.id).dd(options);
             };
         };
         function setInsideWindow(val) {
             actionSettings.insideWindow = val;
         };
         function getInsideWindow() {
             return actionSettings.insideWindow;
         };
         function applyEvents() {
             var mainid = getPostID("postID");
             var actions_array = attributes.actions.split(",");
             for (var iCount = 0; iCount < actions_array.length; iCount++) {
                 var action = actions_array[iCount];
                 var actionFound = $("#" + elementid).attr(action);
                 if (actionFound != undefined) {
                     switch (action) {
                         case "onfocus":
                             $("#" + mainid).bind("mouseenter", function(event) {
                                 document.getElementById(elementid).focus();
                             });
                             break;
                         case "onclick":
                             $("#" + mainid).bind("click", function(event) {
                                 document.getElementById(elementid).onclick();
                             });
                             break;
                         case "ondblclick":
                             $("#" + mainid).bind("dblclick", function(event) {
                                 document.getElementById(elementid).ondblclick();
                             });
                             break;
                         case "onmousedown":
                             $("#" + mainid).bind("mousedown", function(event) {
                                 document.getElementById(elementid).onmousedown();
                             });
                             break;
                         case "onmouseup":
                             //has in closeMe mthod
                             $("#" + mainid).bind("mouseup", function(event) {
                                 document.getElementById(elementid).onmouseup();
                                 //setValue();
                             });
                             break;
                         case "onmouseover":
                             $("#" + mainid).bind("mouseover", function(event) {
                                 document.getElementById(elementid).onmouseover();
                             });
                             break;
                         case "onmousemove":
                             $("#" + mainid).bind("mousemove", function(event) {
                                 document.getElementById(elementid).onmousemove();
                             });
                             break;
                         case "onmouseout":
                             $("#" + mainid).bind("mouseout", function(event) {
                                 document.getElementById(elementid).onmouseout();
                             });
                             break;
                     };
                 };
             };

         };
         function setOutOfVision() {
             var sId = getPostID("postElementHolder");
             $("#" + elementid).after("<div style='height:0px;overflow:hidden;position:absolute;' id='" + sId + "'></div>");
             $("#" + elementid).appendTo($("#" + sId));
         };
         function setTitleText(sText) {
             var titletextid = getPostID("postTitleTextID");
             $("#" + titletextid).html(sText);
         };
         function next() {
             var titletextid = getPostID("postTitleTextID");
             var childid = getPostID("postChildID");
             var allAs = $("#" + childid + " a.enabled");
             for (var current = 0; current < allAs.length; current++) {
                 var currentA = allAs[current];
                 var id = $(currentA).attr("id");
                 if ($(currentA).hasClass("selected") && current < allAs.length - 1) {
                     $("#" + childid + " a.selected").removeClass("selected");
                     $(allAs[current + 1]).addClass("selected");
                     //manageSelection(allAs[current+1]);
                     var selectedA = $("#" + childid + " a.selected").attr("id");
                     if (!ddList) {
                         var sText = (options.showIcon == false) ? a_array[selectedA].text : a_array[selectedA].html;
                         setTitleText(sText);
                     }
                     if (parseInt(($("#" + selectedA).position().top + $("#" + selectedA).height())) >= parseInt($("#" + childid).height())) {
                         $("#" + childid).scrollTop(($("#" + childid).scrollTop()) + $("#" + selectedA).height() + $("#" + selectedA).height());
                     };
                     break;
                 };
             };
         };
         function previous() {
             var titletextid = getPostID("postTitleTextID");
             var childid = getPostID("postChildID");
             var allAs = $("#" + childid + " a.enabled");
             for (var current = 0; current < allAs.length; current++) {
                 var currentA = allAs[current];
                 var id = $(currentA).attr("id");
                 if ($(currentA).hasClass("selected") && current != 0) {
                     $("#" + childid + " a.selected").removeClass("selected");
                     $(allAs[current - 1]).addClass("selected");
                     //manageSelection(allAs[current-1]);
                     var selectedA = $("#" + childid + " a.selected").attr("id");
                     if (!ddList) {
                         var sText = (options.showIcon == false) ? a_array[selectedA].text : a_array[selectedA].html;
                         setTitleText(sText);
                     }
                     if (parseInt(($("#" + selectedA).position().top + $("#" + selectedA).height())) <= 0) {
                         $("#" + childid).scrollTop(($("#" + childid).scrollTop() - $("#" + childid).height()) - $("#" + selectedA).height());
                     };
                     break;
                 };
             };
         };
         function setValue() {
             var childid = getPostID("postChildID");
             var allSelected = $("#" + childid + " a.selected");
             if (allSelected.length == 1) {
                 var sText = $("#" + childid + " a.selected").text();
                 var selectedA = $("#" + childid + " a.selected").attr("id");
                 if (selectedA != undefined) {
                     var sValue = a_array[selectedA].value;
                     document.getElementById(elementid).selectedIndex = a_array[selectedA].index;
                 };
             } else if (allSelected.length > 1) {
                 var alls = $("#" + elementid + " > option:selected").removeAttr("selected");
                 for (var i = 0; i < allSelected.length; i++) {
                     var selectedA = $(allSelected[i]).attr("id");
                     var index = a_array[selectedA].index;
                     document.getElementById(elementid).options[index].selected = "selected";
                 };
             };
         };
         function openMe() {
             var childid = getPostID("postChildID");
             if (oldDiv != "" && childid != oldDiv) {
                 $("#" + oldDiv).slideUp("fast");
                 $("#" + oldDiv).css({ zIndex: '0' });
             };
             if ($("#" + childid).css("display") == "none") {
                 selectedValue = a_array[$("#" + childid + " a.selected").attr("id")].text;
                 $(document).bind("keydown", function(event) {
                     var keyCode = event.keyCode;
                     if (keyCode == 39 || keyCode == 40) {
                         //move to next
                         event.preventDefault(); event.stopPropagation();
                         next();
                     };
                     if (keyCode == 37 || keyCode == 38) {
                         event.preventDefault(); event.stopPropagation();
                         //move to previous
                         previous();
                     };
                     if (keyCode == 27 || keyCode == 13) {
                         closeMe();
                         setValue();
                     };
                     if ($("#" + elementid).attr("onkeydown") != undefined) {
                         document.getElementById(elementid).onkeydown();
                     };
                 });
                 $(document).bind("keyup", function(event) {
                     if ($("#" + elementid).attr("onkeyup") != undefined) {
                         //$("#"+elementid).keyup();
                         document.getElementById(elementid).onkeyup();
                     };
                 });

                 $(document).bind("mouseup", function(evt) {
                     if (getInsideWindow() == false) {
                         closeMe();
                     }
                 });

                 var _winH = $(document).height();
                 var _id = getPostID("postID");
                 var _dimensions = $("#" + _id).offset();
                 // alert(_winH + '-' + _dimensions.top + '-' + $("#" + childid).outerHeight());
                 if (_winH < _dimensions.top + $("#" + childid).outerHeight()) {

                    // $("#" + childid).css("border-bottom", "0");
                     var _topPos = _dimensions.top - $("#" + childid).height();
                     $("#" + childid).css({ top: _topPos }).show();

                     // alert(_topPos);
                 }
                 else {
                     $("#" + childid).css({ zIndex: options.zIndex }).css("border-top", "0");
                     $("#" + childid).slideDown("fast");
                 }

                 if (childid != oldDiv) {
                     oldDiv = childid;
                 }
             };
         };
         function closeMe() {
             var childid = getPostID("postChildID");
             $(document).unbind("keydown");
             $(document).unbind("keyup");
             $(document).unbind("mouseup");
             $("#" + childid).slideUp("fast", function(event) {
                 checkMethodAndApply();
                 $("#" + childid).css({ zIndex: '0' });
             });

         };
         function checkMethodAndApply() {
             var childid = getPostID("postChildID");
             if ($("#" + elementid).attr("onchange") != undefined) {
                 var currentSelectedValue = a_array[$("#" + childid + " a.selected").attr("id")].text;
                 if (selectedValue != currentSelectedValue) { document.getElementById(elementid).onchange(); };
             }
             if ($("#" + elementid).attr("onmouseup") != undefined) {
                 document.getElementById(elementid).onmouseup();
             }
             if ($("#" + elementid).attr("onblur") != undefined) {
                 $(document).bind("mouseup", function(evt) {
                     $("#" + elementid).focus();
                     $("#" + elementid)[0].blur();
                     setValue();
                     $(document).unbind("mouseup");
                 });
             };
         };
         function hightlightArrow(ison) {
             var arrowid = getPostID("postArrowID");
             if (ison == 1)
                 $("#" + arrowid).css({ backgroundPosition: '0 100%' });
             else
                 $("#" + arrowid).css({ backgroundPosition: '0 0' });
         };
     };
     $.fn.msDropDown = function(properties) {
         var dds = $(this);
         for (var iCount = 0; iCount < dds.length; iCount++) {
             if (!$(dds[iCount]).hasClass('dd-converted')) {
                 $(dds[iCount]).addClass('dd-converted');
                 var id = $(dds[iCount]).attr("id");
                 if (properties == undefined) {
                     $("#" + id).dd();
                 } else {
                     $("#" + id).dd(properties);
                 };
             }
         };
     };
 })(jQuery);